home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 7
/
Apprentice-Release7.iso
/
Source Code
/
Pascal
/
Snippets
/
Demo
/
IconCache.p
< prev
next >
Wrap
Text File
|
1997-07-19
|
2KB
|
127 lines
UNIT IconCache;
INTERFACE
USES
Types, Memory, Icons;
FUNCTION GetCachedIcon(iconID: INTEGER): CIconHandle;
PROCEDURE PlotCachedIcon(iconID: INTEGER; box: Rect);
PROCEDURE EmptyIconCache;
IMPLEMENTATION
TYPE
IconCacheHandle = ^^IconCacheRec;
IconCacheRec = RECORD
icon: CIconHandle;
iconID: INTEGER;
next: IconCacheHandle;
END;
VAR
cacheHead: IconCacheHandle;
FUNCTION FindCachedIcon(iconID: INTEGER): IconCacheHandle;
VAR
icon: IconCacheHandle;
BEGIN
icon := cacheHead;
WHILE (icon <> NIL) & (icon^^.iconID <> iconID) DO
icon := icon^^.next;
FindCachedIcon := icon;
END;
FUNCTION AllocateIcon(iconID: INTEGER): IconCacheHandle;
VAR
icon: IconCacheHandle;
BEGIN
Handle(icon) := NewHandleClear(SizeOf(IconCacheRec));
IF icon <> NIL THEN
BEGIN
icon^^.icon := GetCIcon(iconID);
IF icon^^.icon <> NIL THEN
BEGIN
HNoPurge(Handle(icon^^.icon));
icon^^.iconID := iconID;
icon^^.next := cacheHead;
cacheHead := icon;
END
ELSE
BEGIN
DisposeHandle(Handle(icon));
icon := NIL;
END;
END;
AllocateIcon := icon;
END;
FUNCTION GetCachedIcon(iconID: INTEGER): CIconHandle;
VAR
icon: IconCacheHandle;
BEGIN
icon := FindCachedIcon(iconID);
IF icon = NIL THEN
icon := AllocateIcon(iconID);
IF icon = NIL THEN
GetCachedIcon := NIL
ELSE
GetCachedIcon := icon^^.icon;
END;
PROCEDURE CenterRect (box1, box2: Rect; VAR box3: Rect);
VAR
w1, w2: INTEGER;
h1, h2: INTEGER;
BEGIN
w1 := box1.right - box1.left;
h1 := box1.bottom - box1.top;
w2 := box2.right - box2.left;
h2 := box2.bottom - box2.top;
box3.top := box1.top + h1 DIV 2 - h2 DIV 2;
box3.left := box1.left + w1 DIV 2 - w2 DIV 2;
box3.bottom := box3.top + h2;
box3.right := box3.left + w2;
END;
PROCEDURE PlotCachedIcon(iconID: INTEGER; box: Rect);
VAR
icon: CIconHandle;
BEGIN
icon := GetCachedIcon(iconID);
IF icon <> NIL THEN
BEGIN
CenterRect(box, icon^^.iconPMap.bounds, box);
PlotCIcon(box, icon);
END;
END;
PROCEDURE EmptyIconCache;
VAR
icon1, icon2: IconCacheHandle;
BEGIN
icon1 := cacheHead;
WHILE (icon1 <> NIL) DO
BEGIN
icon2 := icon1;
icon1 := icon1^^.next;
IF icon2^^.icon <> NIL THEN
DisposeCIcon(icon2^^.icon);
DisposePtr(Ptr(icon2));
END;
cacheHead := NIL;
END;
END.